<?php
class Util{
	private $email;
	private $message;	
	static $_instance;	
	
	// tiene todos los accesos
	public $ACCESOS = array("addFile","addCustomer","viewFiles","viewFilesAdmin","viewCustomers","vencimientos",
						    "vencimientosAdmin","logs","backups","papelera","consultas","consultasAdmin",
						    "superClientes","perfil","facturacion","misFacturas","adminAccesos");
					    
    // tiene los accesos pertenecientes a la seccion ADMIN
	public $ACCESOS_ADMIN = array("addFile","addCustomer","viewFilesAdmin","viewCustomers","vencimientosAdmin","logs","backups"
					    ,"papelera","consultasAdmin","superClientes","facturacion","adminAccesos");
					   
	// tiene los accesos pertenecientes a la seccion CLIENTES
	public $ACCESOS_CLIENTES = array("viewFiles","vencimientos","consultas","perfil","misFacturas");
	
	/*La funciï¿½n construct es privada para evitar que el objeto pueda ser creado mediante new*/
	private function __construct(){ }	
	
	/*Evitamos el clonaje del objeto. Patrï¿½n Singleton*/
	private function __clone(){ }
	
	/*Funciï¿½n encargada de crear, si es necesario, el objeto. Esta es la funciï¿½n que debemos llamar desde fuera de la clase para instanciar el objeto, y asï¿½, poder utilizar sus mï¿½todos*/
	public static function getInstance(){
		if (!(self::$_instance instanceof self)){
			self::$_instance=new self();
		}
		return self::$_instance;
	}	

	///////////////// ***************  Funciones Utiles desde aca ***************** ////////////////////
	
	public function log($filename, $desc, $texto){
		$ddf = fopen($filename,"a");		
		fwrite($ddf,"[".date("r")."] Log > $desc: $texto \r\n");
		fclose($ddf);
	}	

		
	

	public function getRealIpAddr(){
		if (!empty($_SERVER['HTTP_CLIENT_IP'])){ //check ip from share internet
			$ip=$_SERVER['HTTP_CLIENT_IP'];
		}elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])){ //to check ip is pass from proxy
			$ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
		}else{
			$ip=$_SERVER['REMOTE_ADDR'];
		}
		return $ip;
	}
	
	public function getBrowser(){
		$u_agent = $_SERVER['HTTP_USER_AGENT']; 		
		if(preg_match('/MSIE/i',$u_agent) && !preg_match('/Opera/i',$u_agent)) {			
			return 'IE';
		} elseif(preg_match('/Firefox/i',$u_agent)) { 
			return 'FIREFOX';
		} elseif(preg_match('/Chrome/i',$u_agent)) { 
			return 'CHROME';
		} elseif(preg_match('/Opera/i',$u_agent)) { 
			return 'OPERA';
		} else { 
			return 'OTRO';
		}
	}

	public function giveMeCoolDate($La_fecha_param){	
		$segundos = (strtotime('now')-strtotime($La_fecha_param));	
		$minutos = abs((intval($segundos/60)));
		$horas = abs(intval($minutos/60));	
		$dias = abs(intval($horas/24));
		$meses = abs(intval($dias/30));
		$anos = abs(intval($meses/12));	
		if($minutos == 0){			return ("hace aprox. ".$segundos." segundos");
		}else if($minutos == 1){	return ("hace 1 minuto");
		}else if ($horas == 0){		return ("hace aprox. ".$minutos." minutos");
		}else if ($horas == 1){		return ("hace aprox. 1 hora");
		}else if ($dias == 0 && $horas < 24){
			if ($horas == 1){		return ("hace aprox. 1 hora");
			}else{					return ("hace " . $horas ." horas");
			}
		}else if ($dias == 1){		return ("ayer");
		}else if ($dias <= 30){		return ("hace ". $dias ." dias.");
		}else if ($meses == 1){		return ("hace aprox. 1 mes");
		}else if ($meses < 12){		return ("hace ".$meses." meses");
		}else if ($anos == 1){		return ("hace 1 a&ntilde;o aprox");
		}else{						return ("hace ".$anos." a&ntilde;os");
		}
	}	
	
	public function giveMeCoolDateDias($La_fecha_param){	
		$segundos = (strtotime($La_fecha_param)-strtotime('now'));				
		$minutos = abs((intval($segundos/60)));
		$horas = abs(intval($minutos/60));	
		$dias = abs(intval($horas/24));
		if ($segundos<0){			
			if ($dias == 1){
				return "Vencido! Hace $dias d&iacute;a";
			}else{
				return "Vencido! Hace $dias d&iacute;as";
			}			
		}else{
		if ($dias == 1){
				return "Vence dentro de $dias d&iacute;a";
			}else{
				return "Vence dentro de $dias d&iacute;as";
			}
		}
	}

	public function giveMeDaysForSDU($La_fecha_param){
		// 864000 segundos = 10 dias
		$segundos = ((strtotime($La_fecha_param)+864000)-strtotime('now'));				
		$minutos = abs((intval($segundos/60)));
		$horas = abs(intval($minutos/60));	
		$dias = abs(intval($horas/24));
		return $dias;
	}

	public function acutesForHTML($texto){	
		$texto = str_replace("Ã¡","&aacute;",$texto);
		$texto = str_replace("Ã©","&eacute;",$texto);
		$texto = str_replace("Ã­","&iacute;",$texto);
		$texto = str_replace("Ã³","&oacute;",$texto);
		$texto = str_replace("Ãº","&uacute;",$texto);
		$texto = str_replace("Ã�","&Aacute;",$texto);
		$texto = str_replace("Ã‰","&Eacute;",$texto);
		$texto = str_replace("Ã�","&Iacute;",$texto);
		$texto = str_replace("Ã“","&Oacute;",$texto);
		$texto = str_replace("Ãš","&Uacute;",$texto);
		return $texto;
	}	
	
	
   
    /* Decodifica las entidades HTML */
    public function decodeHtmlEntities($texto){
		return html_entity_decode($texto);
    }
   
    
    
    
	private function getImageScale($anchoMax, $altoMax, $completeUrl){
    	$img = $this->imagecreatefromfile($completeUrl);
		if ($img){				
			// determina el tamaï¿½o de la imagen
			$imx = @ImageSX($img);
			$imy = @ImageSY($img);				
			//determina proporcion en unidades
			$x = $imx/$anchoMax;
			$y = $imy/$altoMax;				
			// calcula la escala
			if($x>$y) $scale = $anchoMax/$imx;
			if($x<$y) $scale = $altoMax/$imy;
			if($x==$y) $scale = $altoMax/$imy;				
			//Escala la imagen
			$x = intval($imx*$scale);
			$y = intval($imy*$scale);
			return $x."-".$y;
		}else{
			return "msg:error";
		}
    }   
    
	public function imagecreatefromfile($path){
	    $info = @getimagesize($path);    
	    if(!$info){ return false; }    
	    $functions = array(
	        IMAGETYPE_GIF => 'imagecreatefromgif',
	        IMAGETYPE_JPEG => 'imagecreatefromjpeg',
	        IMAGETYPE_PNG => 'imagecreatefrompng',
	        IMAGETYPE_WBMP => 'imagecreatefromwbmp',
	        IMAGETYPE_XBM => 'imagecreatefromwxbm',
	    );	    
	    if(!$functions[$info[2]]){ return false; }
	    if(!function_exists($functions[$info[2]])){ return false; }
	    return $functions[$info[2]]($path);
	}
    
    public function decodeAmpersands($texto){
    	return str_replace("#AMP#",'&',$texto);
    }
	
	public function br2nl($texto){
		return html_entity_decode($texto);
	}
	
	function espar($num){ 
   		return (($num%2)==0)?true:false; 
	} 
	
	function completarDatos($dato){
		if (trim($dato)==''){
			return "<span class=''>[Sin datos]</span>";
		}else{
			return $dato;
		}
	}
	
	function completarDatosNoHTML($dato){
		if (trim($dato)==''){
			return "[Sin datos]";
		}else{
			return $dato;
		}
	}
	
	function esSuperCliente(){
		$data = $_SESSION["userdata"];
		$data_arr = explode("##",$data);
		$superClienteFlag = $data_arr[5];
		return ($superClienteFlag=='1');
	}
	
	function get_rand_str($length){
		$codelenght = $length;
		$newcode_length = 0;
		$newcode = "";
		while($newcode_length < $codelenght) {
		$part = rand(1,3);
		if($part==1){$a=48;$b=57;}  // Numbers
		if($part==2){$a=65;$b=90;}  // UpperCase
		if($part==3){$a=97;$b=122;} // LowerCase
		$code_part=chr(rand($a,$b));
		$newcode_length = $newcode_length + 1;
		$newcode = $newcode.$code_part;
		}	
		return $newcode;
	}
	
	public function administrarTiempoSesion(){		
		date_default_timezone_set("America/Buenos_Aires");
		$fechaGuardada = $_SESSION["ultimoAcceso"];
		$ahora = date("Y-n-j H:i:s");
		$tiempo_transcurrido = (strtotime($ahora)-strtotime($fechaGuardada)); 
		if($tiempo_transcurrido >= 7200){//7200 milisegundos = 7200/60 = 120 Minutos = 2 Horas			
			return false;
		}else{
			$_SESSION["ultimoAcceso"] = $ahora;
			return true;
		} 
	}
	
	function debugOn(){
		error_reporting(E_ALL);
		ini_set('display_errors', '1');
	}
	function debugOff(){
		error_reporting(E_ALL);
		ini_set('display_errors', '1');
	}
	
	function isVencido($fecha){
		date_default_timezone_set("America/Buenos_Aires");
		$today = time();
		$expiration_date = strtotime($fecha) + (10 * 24 * 60 * 60);
		if ($expiration_date > $today){
		     return false;
		} else {
		     return true;
		}
	}
	
	function tieneVencimiento($fecha){
		if (strrpos($fecha,"00-00")===false){ return true; }else{ return false; }
	}
	
	public function administrarAcceso($seccion){
		if ($_SESSION["AccesosPermitidos"] == '*'){
			return true;
		}
		$data = $_SESSION["AccesosPermitidos"];
		$data_arr = explode("##",$data);
		return in_array($seccion, $data_arr);
	}
	
	/**
	 * Verifica si tiene al menos un permiso del lado admin, para dejarlo entrar.
	 */
	public function administrarAccesoAlAdmin(){
		foreach($this->getUsuarioPermisosArray() as $usuarioAccessItem){
			if (in_array($usuarioAccessItem, $this->ACCESOS_ADMIN)) return true;
		}
		return false;
	}
	
	public function esCliente(){
		$data = $_SESSION["userdata"];
		$data_arr = explode("##",$data);
		return ($data_arr[3] == '3');
	} 
	
	public function esUsuario(){
		$data = $_SESSION["userdata"];
		$data_arr = explode("##",$data);
		return ($data_arr[3] == '1');
	} 
	
	/**
	 * Verifica si tiene al menos un permiso del lado CLIENTES, para dejarlo entrar.
	 */
	public function administrarAccesoClientes(){
		foreach($this->getUsuarioPermisosArray() as $usuarioAccessItem){
			if (in_array($usuarioAccessItem, $this->ACCESOS_CLIENTES)) return true;
		}
		return false;
	}	
	
	function decodeFileType($value){
		 switch ($value) {
            case 'formA': return "Formulario A"; break;
            case 'formB': return "Formulario B"; break;
            case 'formBR': return "Formulario BR"; break;
            case 'formC': return "Formulario C"; break;
            case 'formD': return "Formulario D"; break;
            case 'formE': return "Formulario E"; break;
            case 'formNota206': return "Nota 206"; break;
            case 'nota206': return "Nota 206"; break;
            case 'ensayo': return "Ensayo"; break;
            case 'formSDU': return "Sin derecho a uso"; break;
            case 'formLSDU': return "Levant. de SDU"; break;
            case 'formTintas': return "FC Tintas"; break;
            case 'formDictamen': return "Dictamen de excepcion de tintas"; break;
            case 'form453': return "DJ resolucion 453/10"; break;
            case 'formSolicCert': return "Solicitud de certificado"; break;
            case 'formSDULab': return "Nota SDU laboratorio"; break;
            case 'formSDUCert': return "Nota SDU certificadora"; break;
            case 'formMuestra': return "Pedido toma de muestra"; break;
            case 'formLacrado': return "Acta de lacrado"; break;
            case 'formPilas': return "FC Pilas"; break;
            case 'formCertPilas': return "Certificado Pilas"; break;
            case 'formDesarrollo': return "Nota secretaria desarrollo"; break;
            case 'form896': return "Nota 896/99"; break;
            case 'formChas': return "Excepcion Chas"; break;
            case 'formCertChas': return "Certificado Chas"; break;
            case 'formLCM': return "Certificado LCM"; break;
            case 'formLCM2': return "Solicitud de excepcion LCM"; break;
            case 'formAduana': return "Excepcion LCM Aduana"; break;
            case 'formCoord': return "Excepcion LCM Coordinador"; break;
            case 'form924': return "Nota 924/1999"; break;
            case 'formSDUBaja': return "Baja Sin Derecho a Uso"; break;
            case 'formPG': return "Productos Graficos"; break;
            case 'formSDUPG': return "SDU Productos Graficos"; break;
 		 }
	}	
	
	function getAllFileTypes($bd){
		$return = array();
		array_push($return, array("codigo"=>"formA", "cod"=>"A", "nombre"=>"Formulario A"));
		array_push($return, array("codigo"=>"formB", "cod"=>"B", "nombre"=>"Formulario B"));
		array_push($return, array("codigo"=>"formBR", "cod"=>"BR", "nombre"=>"Formulario BR"));
		array_push($return, array("codigo"=>"formC", "cod"=>"C", "nombre"=>"Formulario C"));
		array_push($return, array("codigo"=>"formD", "cod"=>"D", "nombre"=>"Formulario D"));
		array_push($return, array("codigo"=>"formE", "cod"=>"E", "nombre"=>"Formulario E"));
		array_push($return, array("codigo"=>"formNota206", "cod"=>"Nota206", "nombre"=>"Nota 206"));
		array_push($return, array("codigo"=>"ensayo", "cod"=>"ensayo", "nombre"=>"Ensayo"));
		array_push($return, array("codigo"=>"formSDU", "cod"=>"SDU", "nombre"=>"Sin derecho a uso"));
		array_push($return, array("codigo"=>"formLSDU", "cod"=>"LSDU", "nombre"=>"Levant. de SDU"));
		array_push($return, array("codigo"=>"formTintas", "cod"=>"Tintas", "nombre"=>"FC Tintas"));
		array_push($return, array("codigo"=>"formDictamen", "cod"=>"Dictamen", "nombre"=>"Dictamen de excepcion de tintas"));
		array_push($return, array("codigo"=>"form453", "cod"=>"453", "nombre"=>"DJ resolucion 453/10"));
		array_push($return, array("codigo"=>"formSolicCert", "cod"=>"SolicCert", "nombre"=>"Solicitud de certificado"));
		array_push($return, array("codigo"=>"formSDULab", "cod"=>"SDULab", "nombre"=>"Nota SDU laboratorio"));
		array_push($return, array("codigo"=>"formSDUCert", "cod"=>"SDUCert", "nombre"=>"Nota SDU certificadora"));
		array_push($return, array("codigo"=>"formMuestra", "cod"=>"Muestra", "nombre"=>"Pedido toma de muestra"));
		array_push($return, array("codigo"=>"formLacrado", "cod"=>"Lacrado", "nombre"=>"Acta de lacrado"));
		array_push($return, array("codigo"=>"formPilas", "cod"=>"Pilas", "nombre"=>"FC Pilas"));
		array_push($return, array("codigo"=>"formCertPilas", "cod"=>"CertPilas", "nombre"=>"Certificado Pilas"));
		array_push($return, array("codigo"=>"formDesarrollo", "cod"=>"Desarrollo", "nombre"=>"Nota secretaria desarrollo"));
		array_push($return, array("codigo"=>"form896", "cod"=>"896", "nombre"=>"Nota 896/99"));
		array_push($return, array("codigo"=>"formChas", "cod"=>"Chas", "nombre"=>"Excepcion Chas"));
		array_push($return, array("codigo"=>"formCertChas", "cod"=>"CertChas", "nombre"=>"Certificado Chas"));
		array_push($return, array("codigo"=>"formLCM", "cod"=>"LCM", "nombre"=>"Certificado LCM"));
		array_push($return, array("codigo"=>"formLCM2", "cod"=>"LCM2", "nombre"=>"Solicitud de excepcion LCM"));
		array_push($return, array("codigo"=>"formAduana", "cod"=>"Aduana", "nombre"=>"Excepcion LCM Aduana"));
		array_push($return, array("codigo"=>"formCoord", "cod"=>"Coord", "nombre"=>"Excepcion LCM Coordinador"));
		array_push($return, array("codigo"=>"formSDUBaja", "cod"=>"SDUBaja", "nombre"=>"Baja Sin Derecho a Uso"));
		array_push($return, array("codigo"=>"form924", "cod"=>"924", "nombre"=>"Nota 924/1999"));
		array_push($return, array("codigo"=>"formPG", "cod"=>"PG", "nombre"=>"Productos Graficos"));
		array_push($return, array("codigo"=>"formSDUPG", "cod"=>"SDUPG", "nombre"=>"SDU Productos Graficos"));
		return $return;
	}
	
	function esDistribuidor($distribuidores, $id_distrib){
		for($j=0; $j<sizeof($distribuidores); $j++){
			if ($distribuidores[$j]==$id_distrib){ 
				return true; 
			}
		}
		return false;
	}
	
	public function giveMeShortTextIfIsNeeded($texto_normal){
		$texto_corto = $texto_normal;	
		if (strlen($texto_normal)>15){
			$texto_corto = substr($texto_corto,0,15);
			$texto_corto.= "...";
		}
		return $texto_corto;
	}
	
	private function getUsuarioPermisosArray(){
		$data = $_SESSION["AccesosPermitidos"];
		$data_arr = explode("##",$data);
		return $data_arr;
	}
	
	public function tienePermiso($seccion){
		if ($_SESSION["AccesosPermitidos"] == '*'){
			return true;
		}		
		return in_array($seccion, $this->getUsuarioPermisosArray());
	}
	
	/**
	 * retorna el array de todos los permisos del sistema con un true|false para el usuario en session.
	 * @return unknown_type
	 */
	public function getPermisosConValor(){		
		$accesosDelUsuario = $_SESSION["AccesosPermitidos"];
		$accesosDelUsuario_arr = explode("##",$accesosDelUsuario);		
		$return_array = array();
		foreach ($this->ACCESOS as $permiso){
			$item = array($permiso => in_array($permiso, $accesosDelUsuario));			
			array_push($return_array, $item);
		}
		return $return_array;
	}
	
	/**
	 * devuelve el array de todos los permisos del sistema con un true|false de los permisos pasados por parametro, recibe un string directamente de la DB.
	 * @return unknown_type
	 */
	public function getPermisosDeEsteUsuario($accesosDelUsuario){
		$accesosDelUsuario_arr = explode("##",$accesosDelUsuario);		
		$return_array = array();
		foreach ($this->ACCESOS as $permiso){
			$item = array($permiso => in_array($permiso, $accesosDelUsuario_arr));
			array_push($return_array, $item);
		}
		//print_r($this->ACCESOS);
		return $return_array;
	}
	
	
	public function getArchivosResultadoArray($bd, $resultado, $num_rows, $limite = 0){
		$array_resultado = array();
		for($i=0; $i < $num_rows; $i++){
			if ($limite>0 && $limite==$i){ break; }
			$array_linea = array();
			$row = $bd->fila($resultado);
			$array_linea["id"] = $row["id"];
			$array_linea["path"] = $row["path"];
			$array_linea["tipo"] = $this->completarDatosNoHTML($this->decodeFileType($row["tipo"]));
			$array_linea["nombre"] = $this->completarDatosNoHTML($row["nombre"]);
			$array_linea["fecha_subida"] = $this->completarDatosNoHTML($row["fecha_subida"]);
			$array_linea["usuario_id"] = $this->completarDatosNoHTML($row["usuario_id"]);
			$array_linea["vencimiento"] = $this->completarDatosNoHTML($row["vencimiento"]);
			$array_linea["emision"] = $this->completarDatosNoHTML($row["emision"]);
			$array_linea["uploader_id"] = $this->completarDatosNoHTML($row["uploader_id"]);
			$array_linea["laboratorio"] = $this->completarDatosNoHTML($row["laboratorio"]);
			$array_linea["certificadora"] = $this->completarDatosNoHTML($row["certificadora"]);
			$array_linea["observ_arch"] = $this->completarDatosNoHTML($row["observaciones"]);
			$array_linea["marca"] = $this->completarDatosNoHTML($row["marca"]);
			$array_linea["modelo"] = $this->completarDatosNoHTML($row["modelo"]);
			$array_linea["producto"] = $this->completarDatosNoHTML($row["producto"]);
			$array_linea["origen"] = $this->completarDatosNoHTML($row["origen"]);
			$array_linea["cantidad"] = $this->completarDatosNoHTML($row["cantidad"]);
			$array_linea["caract_desc"] = $this->completarDatosNoHTML($row["caract_desc"]);
			$array_linea["numero_cert"] = $this->completarDatosNoHTML($row["numero_cert"]);
			$array_linea["publico"] = $row["publico"];
			$array_linea["avisado"] = $row["avisado"];
			$array_linea["deleted"] = $row["deleted"];
			
			$fecha_subida = $row["fecha_subida"];
			$vencimiento = $row["vencimiento"];
			$emision = $row["emision"];
			$array_linea["fecha_subida_str"] = substr($fecha_subida,8,2)."/".substr($fecha_subida,5,2)."/".substr($fecha_subida,0,4);
			$array_linea["vencimiento_str"] = substr($vencimiento,8,2)."/".substr($vencimiento,5,2)."/".substr($vencimiento,0,4);
			if ($array_linea["vencimiento_str"]=='00/00/0000'){ $array_linea["vencimiento_str"] = "[SIN DATOS]"; }
			$array_linea["emision_str"] = substr($emision,8,2)."/".substr($emision,5,2)."/".substr($emision,0,4);
			if ($array_linea["emision_str"]=='00/00/0000'){ $array_linea["emision_str"] = "[SIN DATOS]"; }
			
			//analizamos los que pueden venir muy largos
			$array_linea["observ_arch2"] = $this->giveMeShortTextIfIsNeeded($array_linea["observ_arch"]);	
			$array_linea["nombre2"] = $this->giveMeShortTextIfIsNeeded($array_linea["nombre"]);	
			$array_linea["marca2"] = $this->giveMeShortTextIfIsNeeded($array_linea["marca"]);	
			$array_linea["modelo2"] = $this->giveMeShortTextIfIsNeeded($array_linea["modelo"]);	
			$array_linea["origen2"] = $this->giveMeShortTextIfIsNeeded($array_linea["origen"]);	
			$array_linea["producto2"] = $this->giveMeShortTextIfIsNeeded($array_linea["producto"]);	
			$array_linea["caract_desc2"] = $this->giveMeShortTextIfIsNeeded($array_linea["caract_desc"]);	
			$array_linea["numero_cert2"] = $this->giveMeShortTextIfIsNeeded($array_linea["numero_cert"]);	
			$array_linea["cantidad2"] = $this->giveMeShortTextIfIsNeeded($array_linea["cantidad"]);
			
			
			$array_linea["id2"] = $this->get_rand_str(5);
			$array_linea["id3"] = $this->get_rand_str(5);
			$array_linea["id4"] = $this->get_rand_str(5);
			$array_linea["id5"] = $this->get_rand_str(5);
			$array_linea["id6"] = $this->get_rand_str(5);
			$array_linea["id7"] = $this->get_rand_str(5);
			$array_linea["id8"] = $this->get_rand_str(5);
			$array_linea["id9"] = $this->get_rand_str(5);
			$array_linea["id10"] = $this->get_rand_str(5);
				
						
			if ($this->espar($i)){$style='impar';}else{$style='par';}
			$array_linea["style"] = $style;
			
			
			$array_linea["publico_SI"] = "";
			$array_linea["publico_NO"] = " checked='checked' ";
			if ($row["publico"]=='1'){
				$array_linea["publico_NO"] = "";
				$array_linea["publico_SI"] = " checked='checked' ";
			}		
			
			
			$vencim = $row["vencimiento"];
			//esto sirve para la lista de los SDU y LSDU
			if ($this->isVencido($vencim)){
 				$array_linea["texto_dias"] = "YA PUEDE VENDER LA MERCADER&Iacute;A"; 
 			}else{ 
 				$array_linea["texto_dias"] = $this->giveMeDaysForSDU($vencim)." D&Iacute;AS"; 
 			};
 			
 			
 			//esto sirve para los que tienen vencimiento			
			if ($this->tieneVencimiento($vencim)){
				$array_linea["fecha_vencim"] = substr($vencim,8,2)."/".substr($vencim,5,2)."/".substr($vencim,0,4);	
			}else{							
				$array_linea["fecha_vencim"] = $this->completarDatosNoHTML("");							
			}
			if ($this->isVencido($vencim)){ $array_linea["style_fecha"] = "red_font"; }else{ $array_linea["style_fecha"] = "green_font"; };		
 			$now = new DateTime("now");
 			$vencim = new DateTime($vencim);
 			if ($vencim > $now){ $array_linea["estado"] = "<span class='uppercase green_font'>VIGENTE</span>"; }
 			else { $array_linea["estado"] = "<span class='uppercase red_font'>VENCIDO</span>"; }
 			
 			
			
			array_push($array_resultado, $array_linea);
		}	
		return $array_resultado;		
	}
	
	
	public function getClientesResultadoArray($bd, $resultado, $num_rows, $limite = 0){
		$array_resultado = array();
		for($i=0; $i < $num_rows; $i++){
			if ($limite>0 && $limite==$i){ break; }
			$array_linea = array();
			$row = $bd->fila($resultado);
			$array_linea["id"] = $row["id"];			
			$array_linea["nombre"] = $this->completarDatosNoHTML($row["nombre"]);
			$array_linea["apellido"] = $this->completarDatosNoHTML($row["apellido"]);
			$array_linea["razon_social"] = $this->completarDatosNoHTML($row["razon_social"]);
			$array_linea["tipo"] = $this->completarDatosNoHTML($row["tipo"]);
			$array_linea["password"] = $this->completarDatosNoHTML($row["password"]);
			$array_linea["usuario"] = $this->completarDatosNoHTML($row["usuario"]);
			$array_linea["direccion"] = $this->completarDatosNoHTML($row["direccion"]);
			$array_linea["pais"] = $this->completarDatosNoHTML($row["pais"]);
			$array_linea["localidad"] = $this->completarDatosNoHTML($row["localidad"]);
			$array_linea["cuit"] = $this->completarDatosNoHTML($row["cuit"]);
			$array_linea["codigo_postal"] = $this->completarDatosNoHTML($row["codigo_postal"]);
			$array_linea["telefono"] = $this->completarDatosNoHTML($row["telefono"]);
			$array_linea["email"] = $this->completarDatosNoHTML($row["email"]);
			$array_linea["contacto"] = $this->completarDatosNoHTML($row["contacto"]);			
			$array_linea["observaciones"] = $this->completarDatosNoHTML($row["observaciones"]);
			$array_linea["logo"] = $this->completarDatosNoHTML($row["logo"]);
			$array_linea["bloqueado"] = $row["bloqueado"];
			$array_linea["fax"] = $this->completarDatosNoHTML($row["fax"]);
			$array_linea["nivel"] = $this->completarDatosNoHTML($row["nivel"]);
			$array_linea["super_cliente"] = $row["super_cliente"];
			$array_linea["distribuidores"] = $this->completarDatosNoHTML($row["distribuidores"]);
			$array_linea["help_tooltips"] = $this->completarDatosNoHTML($row["help_tooltips"]);
			$array_linea["permisos_str"] = $row["permisos"];
			$array_linea["permisos"] = $this->getPermisosDeEsteUsuario($row["permisos"]);
			
								
			if ($this->espar($i)){$style='impar';}else{$style='par';}
			$array_linea["style"] = $style;
			
			$nivelUsuario = $row["nivel"];	
			if ($nivelUsuario==3){ $paginaDeEdicion = "agregarCliente.php"; } else { $paginaDeEdicion = "crearUsuario.php"; }
			$array_linea["paginaDeEdicion"] = $paginaDeEdicion;
			
			array_push($array_resultado, $array_linea);
		}	
		return $array_resultado;		
	}

	
	public function getIDClienteFromIDOT($bd, $idOT){
		$query = "select id_cliente from ordenes_trabajo where id = $idOT;";
		$result = $bd->eje($query);
		$row = $bd->fila($result);
		return $row["id_cliente"];
	}
	
	
	public function getPermisoParaFacturarDoc($bd, $idDoc){
		$query = "select facturado from archivos where id = $idDoc;";
		$result = $bd->eje($query);
		$row = $bd->fila($result);
		return ($row["facturado"] == 0);
	}
	
	
	/**
	 * Esta funcion, dada una OT, replica las notas de credito existentes para la OT asociada y arma las relaciones.
	 * */
	public function replicarNCFromThisOT($bd, $idOT_asociada, $idOT_nueva){
		$id_cliente = $this->getIDClienteFromIDOT($bd, $idOT_asociada);
		
		//ahora itero por todas las NC asociadas a la OT, y las replico junto a su relacion con la nueva OT.
		$query = "select descripcion, valor from notas_credito where id in (select id_nc from nc_ot_relation where id_ot = $idOT_asociada)";
		$result = $bd->eje($query);
		$num_rows = $bd->numRows($result);
		$todo_bien_flag = true;
		for ($i=0; $i<$num_rows; $i++){
			$row = $bd->fila($result);
			$desc = $row["descripcion"];
			$valor = $row["valor"];
			
			//creo una nueva NC
			$query = "insert into notas_credito (id_cliente, fecha_creacion, descripcion, valor) values ($id_cliente, now(), '$desc', $valor);";
			$result = $bd->eje($query);
			$idNC_nueva = $bd->lastID();
			
			//creo la relacion con la nueva OT
			$query = "insert into nc_ot_relation (id_ot, id_nc) values ($idOT_nueva, $idNC_nueva);";
			$result1 = $bd->eje($query);
			if ((!$result && $result1)){
				$todo_bien_flag = false;
				break;
			}		
		}	
		return $todo_bien_flag;	
	}
	
	
	
	/**
	 * Esta funcion, dada una OT, replica las notas de credito existentes para la OT asociada y arma las relaciones.
	 * */
	public function replicarItemsFromThisOT($bd, $idOT_asociada, $idOT_nueva){
		$id_cliente = $this->getIDClienteFromIDOT($bd, $idOT_asociada);
		
		//ahora itero por todos los ITEMS asociados a la OT, y los replico junto a su relacion con la nueva OT.
		$query = "select estado, tipo, descripcion, valor from items_personales where id in (select id_item from items_ot_relation where id_ot = $idOT_asociada)";
		$result = $bd->eje($query);
		$num_rows = $bd->numRows($result);
		$todo_bien_flag = true;
		for ($i=0; $i<$num_rows; $i++){
			$row = $bd->fila($result);
			$estado = $row["estado"];
			$tipo = $row["tipo"];
			$desc = $row["descripcion"];
			$valor = $row["valor"];
			
			//creo un nuevo ITEM
			$query = "insert into items_personales (estado, fecha_creacion, tipo, descripcion, valor) values ('$estado', now(), '$tipo', '$desc', $valor);";
			$result = $bd->eje($query);
			$idITEM_nuevo = $bd->lastID();
			
			//creo la relacion con la nueva OT
			$query = "insert into items_ot_relation (id_ot, id_item) values ($idOT_nueva, $idITEM_nuevo);";
			$result1 = $bd->eje($query);	
			if ((!$result && $result1)){
				$todo_bien_flag = false;
				break;
			}	
		}	
		return $todo_bien_flag;		
	}
	
	
	
	public function relacionarDocsFromThisOT($bd, $idOT_asociada, $idOT_nueva){
		$query = "insert into doc_ot_relation (id_doc, id_ot, valor) select a.id_doc, $idOT_nueva, a.valor from doc_ot_relation a where a.id_ot = $idOT_asociada;";
		$todo_bien_flag = true;
		$result = $bd->eje($query);
		if (!$result){
			$todo_bien_flag = false;
		}
		return $todo_bien_flag;	
	} 
	
	
	public function getItemsQuantityFormOT($bd, $idOT){
		$query = "select count(id) as suma from items_personales where id in (select id_item from items_ot_relation where id_ot = $idOT)";
		$result = $bd->eje($query);
		$row = $bd->fila($result);
		$num_rows_1 = intval($row["suma"]);
		
		$query = "select count(id) as suma from notas_credito where id in (select id_nc from nc_ot_relation where id_ot = $idOT)";
		$result = $bd->eje($query);
		$row = $bd->fila($result);
		$num_rows_2 = intval($row["suma"]);
		
		$query = "select count(id) as suma from doc_ot_relation where id_ot = $idOT";
		$result = $bd->eje($query);
		$row = $bd->fila($result);
		$num_rows_3 = intval($row["suma"]);
		
		return ($num_rows_1 + $num_rows_2 + $num_rows_3);
	}
	
	
	
	public function getValorOfThisDoc($bd, $tipoDoc){
		$query = "select valor from valores_servicios where codigo = '$tipoDoc'";
		$resultado = $bd->eje($query);
		$row = $bd->fila($resultado);
		return $row["valor"];		
	}
	
	
	public function getValorOfThisDocByID($bd, $idDoc){
		$query = "select valor from valores_servicios where codigo = (select tipo from archivos where id = $idDoc)";
		$resultado = $bd->eje($query);
		$row = $bd->fila($resultado);
		return $row["valor"];		
	}
	
	public function getValorOfThisRelDocOT($bd, $idDoc, $idOT){
		$query = "select valor from doc_ot_relation where id_doc = $idDoc and id_ot = $idOT;";
		$resultado = $bd->eje($query);
		$row = $bd->fila($resultado);
		return $row["valor"];
	}
	
	
	public function getTotalAmountFromThisOT($bd, $idOT){
		$contenido = $this->getAllElementsForThisOT($bd, $idOT, true);
		$resultado_total = 0;
		foreach ($contenido as $item){
			if ($item["tipo_elem"]=="NC"){				
				$resultado_total -= intval($item["valor"]);
			}else{
				$resultado_total += intval($item["valor"]);
			}
		}
		return $resultado_total;
	}
	
	
	public function getTotalAmountFromThisOTWithIVA($bd, $idOT){
		$contenido = $this->getAllElementsForThisOT($bd, $idOT, true);
		$resultado_total = 0;
		foreach ($contenido as $item){
			if ($item["tipo_elem"]=="NC"){				
				$resultado_total -= intval($item["valor"]);
			}else{
				$resultado_total += intval($item["valor"]);
			}
		}
		$iva = (intval($resultado_total)*(.21));
		$total = $resultado_total + $iva;
		return $total;
	}
	
	
	public function getAllElementsForThisOT($bd, $idOT, $withValues = false){		
		$array_resultado = array();
		
		//Docuemtnso
		$query = "select a.*, u.id as id_cliente, dor.custom_desc from archivos a, usuarios u, doc_ot_relation dor where a.id =dor.id_doc and u.id = a.usuario_id and dor.id_ot = $idOT";
		$resultado = $bd->eje($query);
		$num_rows = $bd->numRows($resultado);
				
		for($i=0; $i < $num_rows; $i++){
			$array_linea = array();
			$row = $bd->fila($resultado);	
			$array_linea["tipo_elem"] = "DOC";
			$array_linea["nombre"] = $row["nombre"];
			$array_linea["tipo"] = ($row["custom_desc"]!='') ? $row["custom_desc"] : $this->decodeFileType($row["tipo"]);
			$array_linea["path"] = $row["path"];
			$array_linea["valor"] = "XXX";
			$array_linea["id"] = $row["id"];
			$array_linea["custom_desc"] = $row["custom_desc"];
			if ($withValues==true){
				$array_linea["valor"] = $this->getValorOfThisRelDocOT($bd, $row["id"], $idOT);
			}
			array_push($array_resultado, $array_linea);
		}	
		
		//Notas de Credito
		$query = "select nc.* from notas_credito nc where nc.id in (select id_nc from nc_ot_relation where id_ot = $idOT)";
		$resultado = $bd->eje($query);
		$num_rows = $bd->numRows($resultado);
				
		for($i=0; $i < $num_rows; $i++){
			$array_linea = array();
			$row = $bd->fila($resultado);		
			$array_linea["tipo_elem"] = "NC";	
			$array_linea["nombre"] = substr($row["descripcion"],0,25);
			$array_linea["tipo"] = "Nota de Cr&eacute;dito";
			$array_linea["path"] = "";
			$array_linea["valor"] = $row["valor"];
			$array_linea["id"] = $row["id"];
			array_push($array_resultado, $array_linea);
		}	
		
		//Items personales
		$query = "select items.* from items_personales items where items.id in (select id_item from items_ot_relation where id_ot = $idOT)";
		$resultado = $bd->eje($query);
		$num_rows = $bd->numRows($resultado);
				
		for($i=0; $i < $num_rows; $i++){
			$array_linea = array();
			$row = $bd->fila($resultado);		
			$array_linea["tipo_elem"] = "ITEM";	
			$array_linea["nombre"] = $row["descripcion"];
			$array_linea["tipo"] = "Item Personalizado";
			$array_linea["path"] = "";
			$array_linea["valor"] = $row["valor"];
			$array_linea["id"] = $row["id"];
			array_push($array_resultado, $array_linea);
		}			
		return $array_resultado;		
	}
	
	
	public function getAllElementsWithValuesForThisOT($bd, $idOT){
		// el tercer parametro es para que me devuelva los valores y no XXX en documentos
		return $this->getAllElementsForThisOT($bd, $idOT, true);
	}
	
	
	public function getCantidadArchivosTotal($bd, $idCliente){
		$query = "select id from archivos where usuario_id=$idCliente";
		$result = $bd->eje($query);
		$num_rows = $bd->numRows($result);
		return $num_rows;
	}
	
	
	public function getElementosDisponiblesPorCliente($bd, $idCliente){
		$array_resultado = array();
		
		$query = "select * from archivos where usuario_id=$idCliente and facturado=0 and facturable = 1 and id not in (select id from archivos where tipo in (select codigo from valores_servicios where valor = 0)) order by fecha_subida desc";
		$result = $bd->eje($query);
		$num_rows = $bd->numRows($result);	
			
		for($j=0; $j < $num_rows; $j++){
			$array_linea = array();
			$row = $bd->fila($result,0);
			$array_linea["nombre"] = $row["nombre"];
			$array_linea["tipo"] = $this->completarDatosNoHTML($this->decodeFileType($row["tipo"]));
			$array_linea["path"] = $row["path"];
			$array_linea["id"] = $row["id"];
			$array_linea["category"] = "DOC";
			array_push($array_resultado, $array_linea);
		}
		
		$query = "select * from notas_credito where id_cliente=$idCliente and estado = 'D' order by fecha_creacion asc";
		$result = $bd->eje($query);
		$num_rows = $bd->numRows($result);	
			
		for($j=0; $j < $num_rows; $j++){
			$array_linea = array();
			$row = $bd->fila($result,0);
			$array_linea["desc_short"] = substr($row["descripcion"],0,20);
			$array_linea["desc_long"] = $row["descripcion"];
			$array_linea["valor"] = $row["valor"];
			$array_linea["id"] = $row["id"];
			$array_linea["category"] = "NC";
			array_push($array_resultado, $array_linea);
		}
		return $array_resultado;
	}
	
	public function isThisOTEditable($bd, $idOT){
		$query = "select estado from ordenes_trabajo where id=$idOT;";
		$result = $bd->eje($query);
		$row = $bd->fila($result,0);
		$estado = $row["estado"];
		return ($estado == 'A');
	}
	
	
	public function getDataFromIDNC($bd, $idNC){
		$query = "select nc.*, u.razon_social from notas_credito nc, usuarios u where u.id = nc.id_cliente and nc.id = $idNC;";
		$resultado = $bd->eje($query);
		$row = $bd->fila($resultado);
		$result = array();
		$result["idCliente"] = $row["id_cliente"];
		$result["idClienteStr"] = $row["razon_social"];
		$result["desc"] = $row["descripcion"];
		$result["valor"] = $row["valor"];		
		return $result;
	}
	
	
	public function isThisNCEditable($bd, $idNC){
		$query = "select estado from notas_credito where id=$idNC;";
		$result = $bd->eje($query);
		$row = $bd->fila($result);
		$estado = $row["estado"];
		return ($estado == 'D');
	}
	
	public function decodeOTStatus($status){
		if ($status=='A'){
			return "ABIERTA";
		}else if ($status=='C'){
			return "CERRADA";
		}else{ // CA
			return "ANULADA";
		}
	}
	

	public function decodeNCStatus($status){
		if ($status=='D'){
			return "DISPONIBLE";
		}else if ($status=='U'){
			return "UTILIZADA";
		}
	}
	
	
	public function decodeFACStatus($status){
		if ($status=='E'){
			return "EMITIDA";
		}else if ($status=='A'){
			return "ANULADA";
		}else if ($status=='F'){
			return "FACTURADA";
		}
	}
	
	
	public function getRazonSocialFromThisOT($bd, $idOT){
		$query = "select u.razon_social from ordenes_trabajo ot, usuarios u where u.id = ot.id_cliente and ot.id = $idOT;";
		$resultado = $bd->eje($query);
		$row = $bd->fila($resultado);
		return $row["razon_social"];
	}
	
	public function getCorrectDatoExtraProveedores($dato){
		if ($dato == '|') return Array('desc'=>'', 'valor'=>'');
		$arreglo = explode('|',$dato);
		$valor = "$".$arreglo[1];
		return Array('desc'=>$arreglo[0], 'valor'=>$valor);
	}
	
	public function getCorrectDatoExtraReporteProveedores($dato){
		if ($dato == '|') return "";
		$arreglo = explode('|',$dato);
		$valor = "$".$arreglo[1];
		return $arreglo[0].": ".$valor;
	}
	
	public function getSiguienteMesAnio($actual){
		$arr = explode("-",$actual);
		$anio = $arr[0];
		$mes = $arr[1];		
		if ($mes == '12'){
			return (intval($anio)+1)."-01";
		}else{
			$mes = $mes+1;
			if ($mes<10){
				$mes="0".$mes;
			}
			return $anio."-".$mes;	
		}		
	}
	
	public function getTotalFacturadoParaEsteMes($bd, $actual){
		$arr = explode("-",$actual);
		$anio = $arr[0];
		$mes = $arr[1];	
		$query = "select id, id_ot from facturas where fecha_creacion > '$anio-$mes-01 00:00:00' and fecha_creacion < '$anio-$mes-31 23:59:59' and estado='F'";
		$resultado = $bd->eje($query);
		$num_rows = $bd->numRows($resultado);			
		$total = 0;
		for($j=0; $j < $num_rows; $j++){
			$row = $bd->fila($resultado);
			$id_ot = $row["id_ot"];
			$total_factura = intval($this->getTotalAmountFromThisOT($bd, $id_ot));
			$total = $total_factura + $total;
		}
		return $total;
	}
	
	
	public function getDataFromNoticia($bd, $id){
		$query = "select * from notinews where id = $id;";
		$resultado = $bd->eje($query);
		$row = $bd->fila($resultado);
		$result = array();
		$result["titulo"] = $row["titulo"];
		$result["cuerpo"] = $row["cuerpo"];
		$result["path"] = $row["path"];
		$result["tags"] = $row["tags"];
		return $result;
	}
	
	
	
	
	
	
	
	
}?>